blob: c30d8f0da8a28ff309185bf3878e3a462074d627 [file] [log] [blame]
Junio C Hamano1a4e8412005-12-27 08:17:231git-diff-index(1)
2=================
3
4NAME
5----
Junio C Hamano7e590a12013-06-02 23:46:526git-diff-index - Compare a tree to the working tree or index
Junio C Hamano1a4e8412005-12-27 08:17:237
8
9SYNOPSIS
10--------
Junio C Hamano15567bc2011-07-23 00:51:5911[verse]
Junio C Hamano59a32b02021-12-10 22:53:3812'git diff-index' [-m] [--cached] [--merge-base] [<common-diff-options>] <tree-ish> [<path>...]
Junio C Hamano1a4e8412005-12-27 08:17:2313
14DESCRIPTION
15-----------
Junio C Hamano7e590a12013-06-02 23:46:5216Compares the content and mode of the blobs found in a tree object
17with the corresponding tracked files in the working tree, or with the
18corresponding paths in the index. When <path> arguments are present,
19compares only paths matching those patterns. Otherwise all tracked
20files are compared.
Junio C Hamano1a4e8412005-12-27 08:17:2321
22OPTIONS
23-------
24include::diff-options.txt[]
25
26<tree-ish>::
27The id of a tree object to diff against.
28
29--cached::
Junio C Hamanodf3d3cd2020-11-02 22:05:0530Do not consider the on-disk file at all.
31
32--merge-base::
33Instead of comparing <tree-ish> directly, use the merge base
34between <tree-ish> and HEAD instead. <tree-ish> must be a
35commit.
Junio C Hamano1a4e8412005-12-27 08:17:2336
37-m::
38By default, files recorded in the index but not checked
39out are reported as deleted. This flag makes
Junio C Hamano1aa40d22010-01-21 17:46:4340'git diff-index' say that all non-checked-out files are up
Junio C Hamano1a4e8412005-12-27 08:17:2341to date.
42
Junio C Hamano1a4e8412005-12-27 08:17:2343include::diff-format.txt[]
44
Junio C Hamanob9d9d902018-05-23 07:07:4245OPERATING MODES
Junio C Hamano1a4e8412005-12-27 08:17:2346---------------
47You can choose whether you want to trust the index file entirely
Junio C Hamano92d80372016-07-13 22:00:0548(using the `--cached` flag) or ask the diff logic to show any files
Junio C Hamano1a4e8412005-12-27 08:17:2349that don't match the stat state as being "tentatively changed". Both
50of these operations are very useful indeed.
51
Junio C Hamanob9d9d902018-05-23 07:07:4252CACHED MODE
Junio C Hamano1a4e8412005-12-27 08:17:2353-----------
Junio C Hamano92d80372016-07-13 22:00:0554If `--cached` is specified, it allows you to ask:
Junio C Hamano1a4e8412005-12-27 08:17:2355
56show me the differences between HEAD and the current index
Junio C Hamano1aa40d22010-01-21 17:46:4357contents (the ones I'd write using 'git write-tree')
Junio C Hamano1a4e8412005-12-27 08:17:2358
59For example, let's say that you have worked on your working directory, updated
Junio C Hamano235a91e2006-01-07 01:13:5860some files in the index and are ready to commit. You want to see exactly
Junio C Hamanodcc22ee2006-11-03 02:40:1361*what* you are going to commit, without having to write a new tree
Junio C Hamano1a4e8412005-12-27 08:17:2362object and compare it that way, and to do that, you just do
63
Junio C Hamanofce7c7e2008-07-02 03:06:3864git diff-index --cached HEAD
Junio C Hamano1a4e8412005-12-27 08:17:2365
66Example: let's say I had renamed `commit.c` to `git-commit.c`, and I had
Junio C Hamanofce7c7e2008-07-02 03:06:3867done an `update-index` to make that effective in the index file.
68`git diff-files` wouldn't show anything at all, since the index file
Junio C Hamano1aa40d22010-01-21 17:46:4369matches my working directory. But doing a 'git diff-index' does:
Junio C Hamano1a4e8412005-12-27 08:17:2370
Junio C Hamanofce7c7e2008-07-02 03:06:3871 torvalds@ppc970:~/git> git diff-index --cached HEAD
Junio C Hamano7bc73592022-07-11 23:08:3472 :100644 000000 4161aecc6700a2eb579e842af0b7f22b98443f74 0000000000000000000000000000000000000000 D commit.c
73 :000000 100644 0000000000000000000000000000000000000000 4161aecc6700a2eb579e842af0b7f22b98443f74 A git-commit.c
Junio C Hamano1a4e8412005-12-27 08:17:2374
Junio C Hamanodcc22ee2006-11-03 02:40:1375You can see easily that the above is a rename.
Junio C Hamano1a4e8412005-12-27 08:17:2376
Junio C Hamanofce7c7e2008-07-02 03:06:3877In fact, `git diff-index --cached` *should* always be entirely equivalent to
Junio C Hamano1aa40d22010-01-21 17:46:4378actually doing a 'git write-tree' and comparing that. Except this one is much
Junio C Hamano1a4e8412005-12-27 08:17:2379nicer for the case where you just want to check where you are.
80
Junio C Hamano1aa40d22010-01-21 17:46:4381So doing a `git diff-index --cached` is basically very useful when you are
Junio C Hamanoa77a5132007-06-08 16:13:4482asking yourself "what have I already marked for being committed, and
Junio C Hamano1a4e8412005-12-27 08:17:2383what's the difference to a previous tree".
84
Junio C Hamanob9d9d902018-05-23 07:07:4285NON-CACHED MODE
Junio C Hamano1a4e8412005-12-27 08:17:2386---------------
87The "non-cached" mode takes a different approach, and is potentially
88the more useful of the two in that what it does can't be emulated with
Junio C Hamano1aa40d22010-01-21 17:46:4389a 'git write-tree' + 'git diff-tree'. Thus that's the default mode.
Junio C Hamano1a4e8412005-12-27 08:17:2390The non-cached version asks the question:
91
92 show me the differences between HEAD and the currently checked out
Junio C Hamano88bf5712017-09-10 08:39:2393 tree - index contents _and_ files that aren't up to date
Junio C Hamano1a4e8412005-12-27 08:17:2394
95which is obviously a very useful question too, since that tells you what
Junio C Hamano1aa40d22010-01-21 17:46:4396you *could* commit. Again, the output matches the 'git diff-tree -r'
Junio C Hamano1a4e8412005-12-27 08:17:2397output to a tee, but with a twist.
98
99The twist is that if some file doesn't match the index, we don't have
100a backing store thing for it, and we use the magic "all-zero" sha1 to
101show that. So let's say that you have edited `kernel/sched.c`, but
Junio C Hamano1aa40d22010-01-21 17:46:43102have not actually done a 'git update-index' on it yet - there is no
Junio C Hamano1a4e8412005-12-27 08:17:23103"object" associated with the new state, and you get:
104
Junio C Hamanoef5a2f92011-05-31 19:53:33105 torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD
Junio C Hamano7bc73592022-07-11 23:08:34106 :100644 100644 7476bb5ba 000000000 M kernel/sched.c
Junio C Hamano1a4e8412005-12-27 08:17:23107
Junio C Hamano88bf5712017-09-10 08:39:23108i.e., it shows that the tree has changed, and that `kernel/sched.c` is
109not up to date and may contain new stuff. The all-zero sha1 means that to
Junio C Hamano1a4e8412005-12-27 08:17:23110get the real diff, you need to look at the object in the working directory
111directly rather than do an object-to-object diff.
112
Junio C Hamano1aa40d22010-01-21 17:46:43113NOTE: As with other commands of this type, 'git diff-index' does not
Junio C Hamano1a4e8412005-12-27 08:17:23114actually look at the contents of the file at all. So maybe
115`kernel/sched.c` hasn't actually changed, and it's just that you
116touched it. In either case, it's a note that you need to
Junio C Hamano1aa40d22010-01-21 17:46:43117'git update-index' it to make the index be in sync.
Junio C Hamano1a4e8412005-12-27 08:17:23118
119NOTE: You can have a mixture of files show up as "has been updated"
120and "is still dirty in the working directory" together. You can always
121tell which file is in which state, since the "has been updated" ones
122show a valid sha1, and the "not in sync with the index" ones will
123always have the special all-zero sha1.
124
Junio C Hamano1a4e8412005-12-27 08:17:23125GIT
126---
Junio C Hamanof7c042d2008-06-06 22:50:53127Part of the linkgit:git[1] suite